#include "Call.h"
#include "IVisitor.h"

Call::Call(const exprTypePtr& func, const ExprTypeList& args, const KeywordTypeList& keywords, const exprTypePtr& starargs, const exprTypePtr& kwargs, int nodeId):
    exprType(nodeId),
    _func(func),
    _args(args),
    _keywords(keywords),
    _starargs(starargs),
    _kwargs(kwargs)
{
}
    
Call::~Call()
{
    _args.clear();_keywords.clear();
}
    
Ast::AstTypes Call::type() const
{
    return Ast::Call;
}
    

exprTypePtr Call::func()
{
    return _func;
}

void Call::setFunc(const exprTypePtr& func)
{
    _func = func;
}

ExprTypeList Call::args()
{
    return _args;
}

void Call::setArgs(const ExprTypeList& args)
{
    _args = args;
}

KeywordTypeList Call::keywords()
{
    return _keywords;
}

void Call::setKeywords(const KeywordTypeList& keywords)
{
    _keywords = keywords;
}

exprTypePtr Call::starargs()
{
    return _starargs;
}

void Call::setStarargs(const exprTypePtr& starargs)
{
    _starargs = starargs;
}

exprTypePtr Call::kwargs()
{
    return _kwargs;
}

void Call::setKwargs(const exprTypePtr& kwargs)
{
    _kwargs = kwargs;
}

    
QString Call::toString() const
{
    return QString("Call[func=%1, args=%2, keywords=%3, starargs=%4, kwargs=%5]").
                arg(_func ? _func->toString():"").
                arg(_args.toString()).
                arg(_keywords.toString()).
                arg(_starargs ? _starargs->toString():"").
                arg(_kwargs ? _kwargs->toString():"");
}
    
void Call::accept(IVisitor* visitor, const SimpleNodePtr& node)
{
    visitor->visitCall(node.dynamicCast<Call>());
}
    
void Call::traverse(IVisitor* visitor)
{
    if (_func != NULL)
        _func->accept(visitor, _func);
    _args.traverse(visitor);
    _keywords.traverse(visitor);
    if (_starargs != NULL)
        _starargs->accept(visitor, _starargs);
    if (_kwargs != NULL)
        _kwargs->accept(visitor, _kwargs);
}